package com.ai.fupincore.util;

import java.io.InputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import com.ai.fupincore.util.DateUtil.DATE_PATTERN;
import com.cmos.core.logger.Logger;
import com.cmos.core.logger.LoggerFactory;
import com.cmos.core.util.ConvertUtil;
import com.cmos.onest.ONestUtil;

/**
 * 对象存储工具类，用于使用Onest进行对象的存储与读取
 * @author wangwei
 *
 */
public class OnestUtil {
    private static final Logger logger = LoggerFactory.getUtilLog(OnestUtil.class);

    /**
     * @throws Exception 
    * @author 黄承文
    * @Title: executeUploadImg
    * @Description: 上传图片
    * @param @param  onestMap     //env.getProperty("ONEST.DISPLAY-NAME")
    * @param @param fileData  //图片数据
    * @param @param fileName  //图片名
    * @param @return    设定文件
    * @return Map<String,String>    返回类型
    * @throws
    */
    public static Map<String,String> executeUploadImg(Map<String,String> onestMap,String fileData, String fileName) throws Exception {
        InputStream is = ConvertUtil.string2InputStream(fileData);
        String suffix = fileName.substring(fileName.lastIndexOf("."));
        Map<String, String> mapResult = new HashMap<String, String>();
        if (".jpg".equalsIgnoreCase(suffix) || ".png".equalsIgnoreCase(suffix) || ".gif".equalsIgnoreCase(suffix)) {
            String fileNameUpload = DateUtil.date2String(new Date(), DATE_PATTERN.YYYYMMDDHHMMSSSSS)
                    + StringUtil.createRandom(true, 4) + suffix;
            String url = uploadAndGetPrivateUrlForH5(onestMap, fileNameUpload, is);
            mapResult.put("fileName", fileNameUpload);
            mapResult.put("filePath", url);
        } 
        return mapResult;
    }
    /**
     * 对像存储，上传文件流
     * @param busiCode  业务编码（在onest.properties中进行配置）
     * @param fileNamePath 文件名（可以带上目录结构，例如a/b/1.txt 或 1.txt）
     * @param inputStream   文件流数据
     * @param userMetadata  扩展信息（注意目前暂不支持中文，如果需要传递中文，将value需要使用URLEncode进行转码，读取方进行decode后使用）
     * @return
     * @throws Exception
     */
    public static String uploadAndGetPrivateUrl(String busiCode, String fileNamePath, InputStream inputStream) throws Exception {
        String bucketName = busiCode;
        String url = "";
        try {
            url = ONestUtil.uploadAndGetPrivateUrl(bucketName, fileNamePath, inputStream);
            return url;
        } catch (Exception e) {
            logger.error("ONEST文件上传***上传出错*******");
            throw new Exception(e.getMessage());
            //return url;
        } // 请求上传流
    }

    /**
     * 对像存储，上传文件流为互联网H5端使用
     * @param onestMap  onest配置（在onest.properties中进行配置）
     * @param fileNamePath 文件名（可以带上目录结构，例如a/b/1.txt 或 1.txt）
     * @param inputStream   文件流数据
     * @param userMetadata  扩展信息（注意目前暂不支持中文，如果需要传递中文，将value需要使用URLEncode进行转码，读取方进行decode后使用）
     * @return
     * @throws Exception
     */
    public static String uploadAndGetPrivateUrlForH5(Map<String,String> onestMap, String fileNamePath, InputStream inputStream) throws Exception {
        String bucketName = onestMap.get("bucketName");//onestMap.get("ONEST.BUCKET_NAME") + "/" + DateUtil.date2String(new Date(), DateUtil.DATE_PATTERN.YYYYMM);
        String url = "";
        try {
            url = OnestUtil.uploadAndGetPrivateUrl(bucketName, fileNamePath, inputStream);
            logger.info("onest返回url==="+url );
            url = url.substring(url.indexOf(onestMap.get("ONEST.BUCKET_NAME")));
            logger.info("截取url===="+url);
            return url;
        } catch (Exception e) {
        	 logger.info("urlONEST文件上传出错*****上传失败*********");
//            logger.error(e.getMessage(), e);
//            throw new Exception(e.getMessage());
        	 return "";
        } // 请求上传流
    }

    /**
     * 对像存储，上传临时文件文件流，有效期保留一天
     * @param busiCode  业务编码（在onest.properties中进行配置）
     * @param fileNamePath 文件名（可以带上目录结构，例如a/b/1.txt 或 1.txt）
     * @param inputStream   文件流数据
     * @param userMetadata  扩展信息（注意目前暂不支持中文，如果需要传递中文，将value需要使用URLEncode进行转码，读取方进行decode后使用）
     * @return
     * @throws Exception
     */
    public static String uploadAndGetPrivateUrlForTemp(String busiCode, String fileNamePath, InputStream inputStream)
        throws Exception {
        String bucketName = busiCode;
        String url = "";
        try {
            url = ONestUtil.uploadAndGetPrivateUrl(bucketName, fileNamePath, inputStream,
                DateUtil.date2String(DateUtil.currentNextDay(), DateUtil.DATE_PATTERN.YYYY_MM_DD));
//            url = PropertiesUtil.getString("ONEST_ENDPOINT_DISPLAY") + "/"
//                + url.substring(url.indexOf(PropertiesUtil.getString("BUCKET_NAME")));
            return url;
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            throw new Exception(e.getMessage());
        } // 请求上传流
    }

    /**
     * 根据容器名称 与 文件名称 获取云端对象
     * @param bucketName    容器名称
     * @param fiilNamePath  文件名称
     * @return object
     *  object.getBucketName(); //容器名称
        object.getObjectContent();  //文件流
        object.getObjectMetadata(); //扩展信息
     * @throws Exception 
     * @throws Exception
     */
    public static String getUrl(String busiCode, String fiilNamePath) throws Exception {
        String url = "";
        try {
            url = ONestUtil.getPrivateFileUrl(busiCode, fiilNamePath);
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            throw new Exception(e.getMessage());
        } // 获取云端对象
        return url;
    }
   
}
